.Dd December 16, 2009
.Dt MACRUBYC 1
.Os
.Sh NAME
.Nm macrubyc
.Nd MacRuby Ahead-of-Time Compiler
.Sh SYNOPSIS
.Nm macrubyc
.Op Ar options...
.Ar files...
.Sh DESCRIPTION
.Nm macrubyc
is a command-line interface to the MacRuby Ahead-of-Time (AOT) compiler. It statically compiles Ruby source code into native machine code (object files), and can then link it (dynamically or statically) into executables or dynamic libraries.  It is typically invoked from
.Nm ruby_deploy
rather than being called directly.
.Pp
The Ahead-of-Time compilation process has two major advantages. The Ruby code does not need to be parsed and compiled at runtime, which improves the startup time of the program, and the original Ruby source code is no longer available, as it has been compiled down to machine code.
.Pp
.Nm macrubyc
allows the compilation of Ruby programs that will use the MacRuby dynamic runtime, supporting the entire Ruby specifications set. It also permits static compilation of Ruby code into a standalone executable that embeds a static version of the MacRuby runtime. These executables can be deployed on environments where MacRuby is not installed, but some features of the Ruby language are not supported.
.Sh OPTIONS
The
.Nm macrubyc
tool accepts the following command-line options:
.Bl -tag -width "123" -compact
.Pp
.It Fl a Ar arch , Fl -arch Ar arch
Compile for specified CPU architecture. By default,
.Nm macrubyc
will compile for the current architecture. This option will compile for a different architecture. When this option is provided more than once,
.Nm macrubyc
will create a universal binary. At the time of this writing, only the i386 and x86_64 architectures are supported.
.Pp
.It Fl c
Compile and assemble, but do not link. This option produces a Mach-O object file (.o) for every Ruby source file passed to
.Nm macrubyc ,
using a default file name which consists of the source file name with the .o file extension. Such a file can later be passed to
.Nm macrubyc
to create a dynamic library or executable.
.Pp
.It Fl C
Compile, assemble, and link a loadable object file. This option produces a Mach-O MacRuby loadable object bundle (.rbo) for every Ruby source file passed to
.Nm macrubyc ,
using a default file name which consists of the source file name with the .rbo file extension. A MacRuby loadable object is a Mach-O bundle, compiled with a global constructor that will evaluate the Ruby machine code once it's loaded by the dynamic linker, at runtime, generally upon a call to Ruby's 
.Nm require
method.
.Pp
.It Fl h, Fl -help
Display a short description of the command line options.
.Pp
.It Fl o Ar file
Place the output into
.Ar file .
If this option is not given, 
.Nm macrubyc
will try to determine a default output file name based on the object file type that is being generated. For executables, the default is a.out. For objects, the default is the original source file name with the object type extension. For dynamic libraries, this option is mandatory.
.Pp
.It Fl -dylib
Create a dynamic library instead of an executable. This option compiles every Ruby source file passed to 
.Nm macrubyc
and produces a Mach-O dynamic library (.dylib). This library is compiled with a global constructor that will register every Ruby machine code file into the MacRuby runtime once it's loaded by the dynamic linker, at runtime. This library is intended to be linked against an executable that uses the MacRuby runtime, for example executables generated by
.Nm macrubyc .
The
.Fl o
option must be provided when building dynamic libraries.
.Pp
.Bl -tag -width XXXXXXXXXX
The
.Fl -dylib
option can also take the following optional linker arguments (see
.Xr libtool 1
for more information):
.It Fl -compatibility_version Ar VERSION
.It Fl -current_version Ar VERSION
.It Fl -install_name Ar NAME
.El
.Pp
.It Fl -static
Create a standalone, static executable. By default, executables created by
.Nm macrubyc
are dynamically linked against the MacRuby runtime. This option will generate executables that are statically linked against the MacRuby runtime, significantly increasing the binary size but allowing its distribution on environments where MacRuby is not installed. This option can only be used when creating executables. Some features of the Ruby language are disabled when using this option.
.Pp
.It Fl -framework Ar name
Use a given framework during compilation and link. This also activates pre-compilation of the BridgeSupport metadata in the generated binary. This option is only used with --static. The Foundation framework is pre-included.
.Pp
.It Fl -sdk Ar path
Use a given SDK during compilation and link. This option is useful when cross-compiling MacRuby programs for different platform versions. This option is only used with --static.
.Pp
.It Fl v, Fl -version
Display the version.
.Pp
.It Fl V, Fl -verbose
Print every command line executed by
.Nm macrubyc .
This option is generally used for internal debugging.
.El
.Sh EXAMPLES
When used without options,
.Nm macrubyc
will create a binary executable, like the C compiler.
.Pp
.Dl $ echo """p 42""" > test.rb
.Dl $ macrubyc test.rb
.Dl $ ./a.out
.Pp
When building an executable, the very first file passed to
.Nm macrubyc
will be considered as the main file. Its machine code will be run once the executable starts. Other machine code files will be linked into the executable, but only run upon calls to the 
.Nm require
method.
.Pp
.Dl $ echo """def t1; 21; end""" > t1.rb
.Dl $ echo """def t2; 21; end""" > t2.rb
.Dl $ echo """require 't1'; require 't2'; p t1+t2""" > test.rb
.Dl $ macrubyc test.rb t1.rb t2.rb -o test
.Dl $ ./test
.Pp
.Nm macrubyc
is also able to generate a dynamic library (.dylib) out of Ruby source files, using the
.Fl -dylib
option. Such a library can later be linked against an executable that uses the MacRuby runtime. Like executables, the Ruby machine code files will run upon calls to the 
.Nm require
method. Libraries can also be passed to
.Nm macrubyc
when forming an executable, allowing the compilation of multiple executables sharing common code.
.Pp
.Dl $ macrubyc t1.rb t2.rb -o code.dylib --dylib
.Dl $ macrubyc test.rb code.dylib -o test
.Dl $ ./test
.Pp
It is possible to statically compile MacRuby code into a standalone executable. The resulted binary includes the MacRuby static runtime and therefore can be executed on environments where MacRuby is not installed. Please note that the static runtime disables some features of the Ruby language.
.Pp
.Dl $ macrubyc test.rb -o test --static
.Pp
Static compilation may require --framework and --sdk flags depending of your project.
.Pp
.Sh USAGE
Generally, you should use
.Nm macruby
and
.Nm macirb
during development, and
.Nm macruby_deploy
(via the Xcode target) when deploying Cocoa applications.  However, calling
.Nm macrubyc
provides greater control, and allows you to create libraries and standalone executables. 
.Pp
The easiest way to compile an existing project is to generate loadable object bundles for every Ruby source file, e.g., using the
.Fl C
option and the find command:
.Pp
.Dl $ find ./lib -name """*.rb""" -exec macrubyc -C {} \e;
.Pp
This creates bundles with the .rbo file extension in the same directory as the original .rb source files. The MacRuby runtime will always pick .rbo files over .rb files upon calls to the 
.Nm require
method. The source files can then be removed. 
.Pp
.Sh SEE ALSO
.Xr macruby 1 ,
.Xr macirb 1 ,
.Xr macrubyd 1 ,
.Xr macruby_deploy 1
